// 演示日志系统的使用方法

#include "../logsystem/log.hpp"
#include <iostream>
#include <string>
#include <memory>

void TestLog(const std::string &name)
{
    Yohifo::Logger::ptr logger = Yohifo::LoggerManage::GetInstance().GetLogger(name);

    RINFO("测试开始");

    logger->DEBUG("测试语句");
    logger->INFO("测试语句");
    logger->WARNING("测试语句");
    logger->ERROR("测试语句");
    logger->FATAL("测试语句");

    RINFO("测试结束");
}

// 日志器格式匹配符
// 时间、日志器、线程ID、源文件名称、源文件行号、日志等级、制表符、日志主体消息、换行
// %d    %c     %t      %f         %l          %p       %T     %m           %n
// 时间：年 %Y 月 %m 日 %d 时 %H 分 %M 秒 %S
//   - 在 %d 之后，需要添加 {具体的时间格式}

int main()
{
    // 创建日志器建造者对象(可选择 全局/局部 )
    std::shared_ptr<Yohifo::LoggerBuilder> builder(new Yohifo::GlobalLoggerBuilder);
    builder->BuildLoggerType(Yohifo::LoggerType::LOGGER_ASYNC); // 设置日志器类型( 异步/同步 ) [可省略]
    builder->BuildAsyncType(Yohifo::AsyncType::ASYNC_SAFE); // 如果为异步日志器，需要设置 安全/非安全 模式 [可省略]
    builder->BuildLoggerName("TestAsyncLogger"); // 日志器名称 [不可省略]
    builder->BuildLoggerLimit(Yohifo::LogLevel::Value::DEBUG); // 限制最低输出等级 [不可省略]
    builder->BuildFormat("<%p>[%d{%Y/%m/%d %H:%M:%S}][%c][%t](%f:%l)%T%m%n"); // 自由设置日志消息输出格式 [可省略]
    
    // 设置多种日志落地方案，可选 (标准输出、指定文件、按大小滚动，支持扩展) [可省略]
    builder->BulidSink<Yohifo::StdoutSink>(); // 标准输出
    builder->BulidSink<Yohifo::FileSink>("./LogFile/Test.log"); // 输出至指定文件
    builder->BulidSink<Yohifo::RollBySizeSink>("./LogFile/Base-", 1024 * 1024 * 10); // 按大小滚动，阈值为 10Mb

    // 根据预设条件，建造日志器对象
    builder->Build();

    // 通过单例对象调用( 因为是全局日志器，支持全局访问 )
    TestLog("TestAsyncLogger");

    return 0;
}